﻿#ifndef GEOCOMMANDCOMMON_H_
#define GEOCOMMANDCOMMON_H_

#include <list>
#include <vector>
#include <TopoDS_Edge.hxx>
#include <TopoDS_Wire.hxx>
#include <TopoDS_Shape.hxx>
#include <TopoDS_Face.hxx>
#include <Bnd_Box.hxx>
#include <BRepBndLib.hxx>

namespace Geometry
{
    class GeometrySet;
}
namespace Command
{
    class  GeoCommandCommon
    {
    public:
        GeoCommandCommon() = default;
        ~GeoCommandCommon() = default;

        static std::vector<TopoDS_Wire> bulidWire(std::list<TopoDS_Edge>& edgeList);
        static TopoDS_Shape makeFace(std::vector<TopoDS_Wire>& wires);
        static bool isInside(const TopoDS_Wire&, const TopoDS_Wire&);
        static TopoDS_Face validateFace(const TopoDS_Face&);
        static TopoDS_Shape removeSplitter(const TopoDS_Shape& shape);
        static bool isEmpty(const TopoDS_Shape &shape);
        //从inputShape中移除component，返回移除之前的副本
        static TopoDS_Shape removeShape(TopoDS_Shape* inputShape, TopoDS_Shape* component);
        static gp_Ax2 getEdgeAxis(Geometry::GeometrySet* set, int edgeindex);
        static gp_Ax2 getFaceAxis(Geometry::GeometrySet* set, int index);

    private:
        static TopoDS_Shape makeFace(std::list<TopoDS_Wire>&);

    };












    // sort bounding boxes according to diagonal length
    class Wire_Compare : public std::binary_function<const TopoDS_Wire&,
        const TopoDS_Wire&, bool>
    {
    public:
        bool operator() (const TopoDS_Wire& w1, const TopoDS_Wire& w2)
        {
            Bnd_Box box1, box2;
            if (!w1.IsNull())
            {
                BRepBndLib::Add(w1, box1);
                box1.SetGap(0.0);
            }

            if (!w2.IsNull())
            {
                BRepBndLib::Add(w2, box2);
                box2.SetGap(0.0);
            }

            return box1.SquareExtent() < box2.SquareExtent();
        }
    };
}

#endif